﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__
#define __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__

#include "../tools/head.h"
#include "include_odbc.h"
#include "err_info.h"

namespace xos_odbc
{

    class odbc_dbc : public xos_stl::mem_item< xos::release_impl< odbc_dbc >, thread_lock >,
		public i_dbc
    {
    public:
        typedef xos::release_impl< odbc_dbc > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //

        static int get_addr( POOL *** pppPool, LIST *** pppList );

    public:
        odbc_dbc();
        ~odbc_dbc();

    public:
		// 
		// 得到最近的错误信息
		// 
		int get_last_err_info( char * lpszInfo, int nSize, int * lpnInfoLen, int * lpnLenNeeded );

        // 
        // 利用不同数据库的功能生成对应sql放在lpszSql中，得到最后新增记录的自增ID。
        // 成功返回0,结果在lpIntId中
        // 需要在设置异步前执行
        // 
        int get_last_insert_id( const char * lpszSql, int * lpIntId );

        // 
        // 直接运行sql
        // 
        int execute_direct( const char * lpszSql, i_stmt ** ppStmt );

        // 
        // 编译sql
        // 
        int prepare_sql( const char * lpszSql, i_stmt ** ppStmt );

        // 
        // 生成i_fields
        // 
        int create_fields( i_fields ** ppv );

        // 
        // 创建一个htmt
        // 
        int create_stmt( i_stmt ** ppv );

        // 
        // 设置是否异步执行sql
        // 
        int async_test( bool * bAsyncCon, bool * bAsyncStmt );
        int set_connect_fun_async( bool bAsync );
        int set_async( bool bAsync );

        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
		int end_trans( bool bSuccess );

        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
		int begin_trans();

        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
        int connect();

    public:
        int set_connect_info( void * hWnd, const char * lpszConStr, bool bAsync );
        int set_handle( SQLHANDLE hDbc );
        int init();
        int term();

    private:
        int init_data();

    private:
        char m_szOutputString[1024];
        SQLSMALLINT m_real_len;
        SQLSMALLINT m_out_len;

        std::string m_con_str;
        bool m_bAsync;
        SQLHWND m_hWnd;

        SQLHANDLE m_hDbc;
		err_info m_err;

    };

} // xos_odbc

#endif // __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__
